package jsonprotocol

import (
	"io"
	"time"
)

// Precision 定义时间戳精度
type Precision int

const (
	Nanosecond Precision = iota
	Second
)

// Timestamp 简化版：直接存 time.Time
type Timestamp struct {
	t         time.Time
	precision Precision
}

// NewTimestamp 创建时间戳
func NewTimestamp(t time.Time, p Precision) *Timestamp {
	return &Timestamp{t: t, precision: p}
}

// Time 返回 Go 的 time.Time
func (ts *Timestamp) Time() time.Time {
	switch ts.precision {
	case Second:
		return ts.t.Truncate(time.Second).UTC()
	default:
		return ts.t.UTC()
	}
}

// SetTime 设置时间
func (ts *Timestamp) SetTime(t time.Time) {
	ts.t = t
}

// WriteTo 实现 io.WriterTo（满足 lineprotocol 约束）
func (ts *Timestamp) WriteTo(w io.Writer) (int64, error) {
	// MongoDB 驱动需要 BSON Date 类型，这里写成 ISO8601 格式即可
	str := ts.Time().Format(time.RFC3339Nano)
	n, err := w.Write([]byte(str))
	return int64(n), err
}

// // Precision a type for the precision of the timestamp.
// type Precision int

// // var equalSign = byte(':')

// const (
// 	Nanosecond = iota
// 	Second
// )

// // Timestamp represents a timestamp in line protocol
// // in either second or nanosecond precision.
// type Timestamp struct {
// 	precision Precision
// 	ptr       unsafe.Pointer
// }

// // NewTimestamp returns a pointer to a Timestamp.
// func NewTimestamp(p Precision) *Timestamp {
// 	return &Timestamp{
// 		precision: p,
// 	}
// }

// // TimePtr returns an unsafe.Pointer to an underlying
// // time.Time object.
// func (t *Timestamp) TimePtr() *unsafe.Pointer {
// 	return &t.ptr
// }

// // SetTime takes an pointer to a time.Time and atomically
// // sets the pointer on the Timestamp struct.
// func (t *Timestamp) SetTime(ts *time.Time) {
// 	tsPtr := unsafe.Pointer(ts)
// 	atomic.StorePointer(&t.ptr, tsPtr)
// }

// func (t *Timestamp) WriteTo(w io.Writer) (int64, error) {
// 	// 加载当前时间戳（原子操作确保线程安全）
// 	tsPtr := atomic.LoadPointer(&t.ptr)
// 	tsTime := *(*time.Time)(tsPtr)

// 	// 根据精度调整时间并转换为UTC（MongoDB要求UTC时间）
// 	var adjustedTime time.Time
// 	switch t.precision {
// 	case Second:
// 		// 秒级精度：截断到秒并转为UTC
// 		adjustedTime = tsTime.Truncate(time.Second).UTC()
// 	default:
// 		// 纳秒级精度：直接使用UTC时间
// 		adjustedTime = tsTime.UTC()
// 	}

// 	// 构建MongoDB兼容的时间字段："timestamp": {"$date": "ISO8601格式"}
// 	// 这种格式会被MongoDB驱动正确解析为BSON日期类型
// 	buf := make([]byte, 0, 100)                                         // 预分配足够空间
// 	buf = append(buf, []byte("\"timestamp\":{\"$date\":\"")...)         // 字段名改为小写timestamp
// 	buf = append(buf, []byte(adjustedTime.Format(time.RFC3339Nano))...) // ISO8601格式时间
// 	buf = append(buf, []byte("\"}")...)

// 	// 写入到输出流
// 	n, err := w.Write(buf)
// 	return int64(n), err
// }
